// 涉及范围：YEP_X_BattleSysATB，YEP_BattleAICore，YEP_X_SelectionControl, CP_PetCore
// [BUG描述]
// 召唤护驾时，若护驾存在AI，AI中技能有SelectionControl的限制，则会导致：
// 1.召唤护驾后，下一个我方角色的指令窗口无法选择攻击。
//   若不执行特定行动，则后续角色均有此问题，且会卡在ATB顶端不不动，
//   直至敌我所有角色均到达顶端也无法继续游戏进程。
// 2.不论轮到角色时是否选择有效行动，每次当护驾每次到达ATB顶端时，都会重复出现上述错误。
//   若轮到角色时选择有效行动，护驾会在角色执行完行动后“延迟执行”行动。

// 解决问题1：
// 原本在Scene_Battle.prototype.startActorCommandSelection时会执行Game_Unit.prototype.createActions
// 这里会为护驾执行没有必要的createActions，强行筛选了一波目标，导致后面对角色是否可攻击判定时，因无可选目标而出错。
// 把其中Game_Party.prototype.createActions中的this.members()改成this.battleMembersNotPets()，
// 排除掉不必要的宠物部分即可避免此问题。

Game_Party.prototype.createActions = function() {
  var max = this.battleMembersNotPets().length;
  for (var i = 0; i < max; ++i) {
    var member = this.battleMembersNotPets()[i];
    if (member) member.createActions();
  }
};

// 宠物执行行动时，会先在AI判断阶段进行.setSelectionFilter(true);（不是重点，只是描述流程）
// 而后在updateATBPhase阶段，本应执行的BattleManager.getChargedATBBattler，会因条件筛选出错。
// 此时$gameTroop.aliveMembers()是一个被selectionControl筛选过的范围，
// 即尽管目标活着、但不符合行动范围，也会被判定为死，会莫名输出0，导致getChargedATBBattler返回false，执行行动失败。
// 因此判断条件改为isAllDead()即可避免此问题。

BattleManager.getChargedATBBattler = function() {
  //if ($gameParty.aliveMembers() <= 0 || $gameTroop.aliveMembers() <= 0) {
  if($gameParty.isAllDead() || $gameTroop.isAllDead()){
    return false;
  }
  var fastest = false;
  for (var i = 0; i < this.allBattleMembers().length; ++i) {
    var battler = this.allBattleMembers()[i];
    if (!battler) continue;
    if (!this.isBattlerATBCharged(battler)) continue;
    if (!fastest) {
      fastest = battler;
    } else if (battler.atbCharge() > fastest.atbCharge()) {
      fastest = battler;
    }
  }
  return fastest;
};
